﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;  
using System.Data;
using System.Data.OleDb;
using System.Linq;


namespace Datos
{
	public class Datos
	{
        OleDbConnection con;
        OleDbCommand cmd;
        OleDbDataAdapter da;
        DataSet ds;
        string strCon = string.Empty;
        
        public Datos()
        {
            strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Users\Pavilion\Documents\SharpDevelop Projects\tp-electiva\BDInfraccion.mdb'";
        }
		
        public ArrayList obtenerInfracciones()
        {
            string query = "SELECT * FROM T_Infraccion;";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }
        
        public ArrayList obtenerPropietarios()
        {
            string query = "SELECT * FROM T_Propietario;";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[4]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }        
        
        public ArrayList obtenerVehiculos()
        {
            string query = "SELECT * FROM T_Vehiculo;";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[4]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }        

        public void guardarPropietario(ArrayList datos)
        {
            int dni = (int)datos[0];
            string nombre = (string)datos[1];
            string apellido = (string)datos[2];
            string direccion = (string)datos[3];

            string query = "INSERT INTO T_Propietario (dni,nombre,apellido,direccion) values(" + dni + ",'" + nombre + "','" + apellido + "','" + direccion + "');";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }
                        
        public void guardarVehiculos(ArrayList datos)
        {
            string dominio = (string)datos[0];
            string marca = (string)datos[1];
            int modelo = (int)datos[2];
            int    propId = (int)datos[3];

            string query = "INSERT INTO T_Vehiculo (dominio,marca,modelo,idPropietario) values('" + dominio + "','" + marca + "'," + modelo + "," + propId + ");";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }
        
        public void modificarInfraccion(ArrayList datos) {
        	int id = (int)datos[3];
        	string descripcion = (string)datos[0];
        	int importe = (int)datos[1];
        	
        	string query = "UPDATE T_Infraccion SET descripcion = '" + descripcion + "' , importe = " + importe + " WHERE id = " + id + ";";
			
        	try {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
        		
        	}
        	catch (Exception ex) {
        		string error = ex.Message;
        	}
        }
        
        public void guardarInfraccion(ArrayList datos)
        {
            string descripcion = (string)datos[0];
            int importe = (int)datos[1];
            int tipoInf = (int)datos[2];

            string query = "INSERT INTO T_Infraccion (descripcion,importe,tipoId) values('" + descripcion + "'," + importe + "," + tipoInf + ");";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }

        public ArrayList obtenerVehiculosInfraccion()
        {
            string query = "SELECT * FROM T_VehiculoInfraccion;";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[4]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[5]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[6]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }

        public void pagarInfraccionVehiculo(ArrayList datos)
        {
            int vehiculoId = (int)datos[0];
            int infraccionId = (int)datos[1];
            bool pago = (bool)datos[2];
            DateTime fechaSuceso = (DateTime)datos[3];
            DateTime fechaVenc = (DateTime)datos[4];
            double importe = (double)datos[5];
            int id = (int)datos[6];

            string query = "UPDATE T_VehiculoInfraccion SET pago = 1, importe = " + importe + " WHERE id = " + id + ";";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }

        }

        public void guardarInfraccionVehiculo(ArrayList datos)
        {
            int vehiculoId = (int)datos[0];
            int infraccionId = (int)datos[1];
            bool pago = (bool)datos[2];
            DateTime fechaSuceso = (DateTime)datos[3];
            DateTime fechaVenc   = (DateTime)datos[4];
            double importe = (double)datos[5];

            string query = "INSERT INTO T_VehiculoInfraccion (vehiculoId,infraccionId,pago,fechaSuceso,fechaVenc,importe) values(" + vehiculoId + "," + infraccionId + "," + pago + ",'" + fechaSuceso + "','" + fechaVenc + "'," + importe + ");";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                cmd = new OleDbCommand(query, con);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                con.Close();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }

        public ArrayList obtenerVehiculosPorId(int id)
        {
            string query = "SELECT * FROM T_Vehiculo where id = " + id + ";";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[4]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }        


        public ArrayList obtenerPropietariosPorId(int id)
        {
            string query = "SELECT * FROM T_Propietario where id = " + id + ";";
            ArrayList datos = new ArrayList();
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(query, con);
                ds = new DataSet();
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[0]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[1]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[2]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[3]);
                    datos.Add(ds.Tables[0].Rows[i].ItemArray[4]);
                }
                con.Close();
                da.Dispose();
                ds.Dispose();
            }
            catch (Exception ex)
            {
                string error = ex.Message;
                Console.Write(error);
            }
            return datos;
        }        


        public static bool Guardar(object o)
        {
            bool ok = false;
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FileStream miArchivo = new FileStream("DatosGrabados.dat", FileMode.Create);
                bf.Serialize(miArchivo, o);
                miArchivo.Close();
                ok = true;
            }
            catch (Exception ex)
            {
            	Console.WriteLine("Error al guardar el archivo" + ex.Message);
                ok = false;
            }
            return ok;
        }

        public static object Recuperar()
        {
           try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FileStream miArchivo = new FileStream("DatosGrabados.dat", FileMode.Open);
                object o = bf.Deserialize(miArchivo);
                miArchivo.Close();
                return o;

            }
            catch (Exception ex)
            {
            	Console.WriteLine("Error al abrir el archivo" + ex.Message);
                return null;
            }
        }
		
	}
}
